Inheritance & Overriding

상속(Inheritance)
객체 지향 프로그래밍의 주요한 특성 중 하나이다.
현실세계에서의 상속의 개념을 프로그래밍으로 그대로 가져와 사용할 수 있다.

자식 클래스(Child Class)가 부모 클래스(Parent Class)의 속성을 그대로 물려 받아 사용할 수 있다.
그러므로 상속을 활용하여 소스코드의 재사용성을 늘일 수 있다.

자식 클래스는 파생 클래스(Derived Class)라고도 불리며, 부모 클래스의 모든 속성을 물려 받는다.
자식 클래스는 콜론(:)을 활용하여 부모 클래스와 연결될 수 있다.

class Student : Person        // Student Class이(가) Person Class 를 상속
#include <iostream>
#include <string>
using namespace std;
class Person {
private:
string name;
public:
Person(string name): name(name){}
string getName(){
return name;
}
void showName(){
cout << ": " << getName() << '\n';
}
};
class Student : Person{
private:
int studentID;
public:
Student(int studentID, string name) : Person(name){
this->studentID=studentID;
}
void show(){
cout<<" : "<<studentID<<'\n';
cout<<" : "<<getName()<<'\n';
}
};
int main(void){
Student student(1, "");
student.show();
system("pause");
return 0;
}
상속에서의 생성자와 소멸자
자식 클래스의 인스턴스를 만들 때, 가장 먼저 부모 클래스의 생성자가 호출된다.
이후에 자식 클래스의 생성자가 호출된다. 또한 자식 클래스의 수명이 다했을 때는
자식 클래스의 소멸자가 먼저 호출된 이후에 부모 클래스의 소멸자가 호출된다.
오버라이딩(Overriding)
부모 클래스에서 정의된 함수를 무시하고, 자식 클래스에서 동일한 이름의 함수를 재정의하는 문법
오버라이딩을 적용한 함수의 원형은 기존의 함수와 동일한 매개변수를 전달 받는다.
#include <iostream>
#include <string>
using namespace std;
class Person {
private:
string name;
public:
Person(string name): name(name){}
string getName(){
return name;
}
void showName(){
cout << ": " << getName() << '\n';
}
};
class Student : Person {
private:
int studentID;
public:
Student(int studentID, string name) : Person(name){
this->studentID=studentID;
}
void show(){
cout<<" : "<<studentID<<'\n';
cout<<" : "<<getName()<<'\n';
}
void showName(){ // overriding
cout<<" : "<<getName()<<'\n';
}
};
int main(void){
Student student(1, "");
student.showName();
system("pause");
return 0;
}
다중 상속(Multipple Inheritance)
여러 개의 클래스로부터 멤버를 상속 받는 것을 말한다.
#include <iostream>
#include <string>
using namespace std;
class Temp{
public:
void showTemp(){
cout<<" ."<<'\n';
}
};
class Person {
private:
string name;
public:
Person(string name): name(name){}
string getName(){
return name;
}
void showName(){
cout << ": " << getName() << '\n';
}
};
class Student : Person, public Temp{
private:
int studentID;
public:
Student(int studentID, string name) : Person(name) {
this->studentID=studentID;
}
void show(){
cout<<" : "<<studentID<<'\n';
cout<<" : "<<getName()<<'\n';
}
void showName(){
cout<<" : "<<getName()<<'\n';
}
};
int main(void){
Student student(1, "");
student.showName();
student.showTemp();
system("pause");
return 0;
}
다중 상속의 한계
1) 여러 개의 부모 클래스에 동일한 멤버가 존재할 수 있다.
2) 하나의 클래스를 의도치 않게 여러 번 상속받을 가능성이 있다.

위와 같이 다중 상속은 취약한 구조를 가지고 있다.
(자바같은 경우 다중 상속을 지원하지 않음)
public 상속
기반 클래스의 속성 접근 지정자의 의미를 그대로 두어 상속한다.
원래 private 속성은 접근 금지
private 상속
기반 클래스의 속성 접근 지정자의 의미를 모두 private로 만든다.
원래 private 속성은 접근 금지
protected 상속
기반 클래스의 속성 접근 지정자의 의미를 최대한 protected로 만든다.(public->protected)